/*
 * Consulta.java
 *
 * Created on 16 de Junho de 2007, 01:53
 *
 * To change this template, choose Tools | Template Manager
 * and open the template in the editor.
 */

package org.jerm.Interface.JGraph_Algebra;

import java.util.Vector;

import org.jgraph.graph.DefaultEdge;
import org.jgraph.graph.DefaultGraphCell;
import org.jgraph.graph.GraphConstants;
        
/**
 *
 * @author ra044637
 */
public class Consulta {
    
    protected Object objeto;   //Objeto da consulta (Elemento da arvore de consulta). Ex.: Relacao, Juncao, Projecao, etc...
    protected Vector celulas;  //Vetor com celulas do JGraph (Contem as celulas da arvore completa da consulta).
    private int i;             //Contador utilizado pela funcao getObject() (Sim bahía, ele tem que estar no escopo da classe e não no da funcao, se vc mudar isso vc apanha).
    
    //Inicializador dos atributos da classe, deve ser chamado por todos os construtores. 
    private void start() {
        this.objeto = null;
        this.celulas = new Vector();
        this.i = 0;
    }
    
    //Construtor de arvore de consulta contendo uma Relacao.
    public Consulta(Relacao relacao)
    {
        this.start();
        
        celulas.add(relacao);
        
        objeto = relacao;
    }
    
    //Construtor da arvore de consulta contendo uma projecao.
    public Consulta(Projecao projecao)
    {
        this.start();
        Object[] obj;
        int i;
        
        //Cria a aresta que liga a Projecao ate a arvore de consulta onde a projecao eh aplicada
        DefaultEdge edge = new DefaultEdge();
        edge.setSource(projecao.getChildAt(0));
        edge.setTarget(((DefaultGraphCell) projecao.getConsulta().getObject()).getChildAt(0));
        
        GraphConstants.setDisconnectable(edge.getAttributes(), false);
        GraphConstants.setResize(edge.getAttributes(),false);
        GraphConstants.setLabelAlongEdge(edge.getAttributes(), true);
        GraphConstants.setEditable(edge.getAttributes(),false);
        
        celulas.add(edge);
        celulas.add(projecao);
        obj = projecao.getConsulta().getObjects();
        for(i = 0; i < obj.length; i++)
        {
            celulas.add(obj[i]);
        }
        
        objeto = projecao;
    }
    
    //Construtor da arvore de consulta contendo uma selecao.
    public Consulta(Selecao selecao)
    {
        this.start();
        Object[] obj;
        int i;
        
        //Cria a aresta que liga a Selecao ate a arvore de consulta onde a projecao eh aplicada
        DefaultEdge edge = new DefaultEdge();
        edge.setSource(selecao.getChildAt(0));
        edge.setTarget(((DefaultGraphCell) selecao.getConsulta().getObject()).getChildAt(0));
        
        GraphConstants.setDisconnectable(edge.getAttributes(), false);
        GraphConstants.setResize(edge.getAttributes(),false);
        GraphConstants.setLabelAlongEdge(edge.getAttributes(), true);
        GraphConstants.setEditable(edge.getAttributes(),false);
        
        celulas.add(edge);
        celulas.add(selecao);
        obj = selecao.getConsulta().getObjects();
        for(i = 0; i < obj.length; i++)
        {
            celulas.add(obj[i]);
        }
        
        objeto = selecao;
    }
    
    //Construtor da arvore de consulta contendo uma renomeacao.
    public Consulta(Renomeacao renomeacao)
    {
        this.start();
        Object[] obj;
        int i;
        
        //Cria a aresta que liga a Selecao ate a arvore de consulta onde a projecao eh aplicada
        DefaultEdge edge = new DefaultEdge();
        edge.setSource(renomeacao.getChildAt(0));
        edge.setTarget(((DefaultGraphCell) renomeacao.getConsulta().getObject()).getChildAt(0));
        
        GraphConstants.setDisconnectable(edge.getAttributes(), false);
        GraphConstants.setResize(edge.getAttributes(),false);
        GraphConstants.setLabelAlongEdge(edge.getAttributes(), true);
        GraphConstants.setEditable(edge.getAttributes(),false);
        
        celulas.add(edge);
        celulas.add(renomeacao);
        obj = renomeacao.getConsulta().getObjects();
        for(i = 0; i < obj.length; i++)
        {
            celulas.add(obj[i]);
        }
        
        objeto = renomeacao;
    }
    
    //Construtor da arvore de consulta contendo uma projecao.
    public Consulta(Produto produto)
    {
        this.start();
        Object[] obj;
        int i;
        
        //Cria a aresta que liga o Produto ate a arvore da consulta 1 do produto cartesiano
        DefaultEdge edge1 = new DefaultEdge();
        edge1.setSource(produto.getChildAt(0));
        edge1.setTarget(((DefaultGraphCell) produto.getConsulta1().getObject()).getChildAt(0));
        
        GraphConstants.setDisconnectable(edge1.getAttributes(), false);
        GraphConstants.setResize(edge1.getAttributes(),false);
        GraphConstants.setLabelAlongEdge(edge1.getAttributes(), true);
        GraphConstants.setEditable(edge1.getAttributes(),false);
        
        //Cria a aresta que liga o Produto ate a arvore da consulta 2 do produto cartesiano
        DefaultEdge edge2 = new DefaultEdge();
        edge2.setSource(produto.getChildAt(0));
        edge2.setTarget(((DefaultGraphCell) produto.getConsulta2().getObject()).getChildAt(0));
        
        GraphConstants.setDisconnectable(edge2.getAttributes(), false);
        GraphConstants.setResize(edge2.getAttributes(),false);
        GraphConstants.setLabelAlongEdge(edge2.getAttributes(), true);
        GraphConstants.setEditable(edge2.getAttributes(),false);
        
        
        celulas.add(edge1);
        celulas.add(edge2);
        celulas.add(produto);
        obj = produto.getConsulta1().getObjects();
        for(i = 0; i < obj.length; i++)
        {
            celulas.add(obj[i]);
        }
        obj = produto.getConsulta2().getObjects();
        for(i = 0; i < obj.length; i++)
        {
            celulas.add(obj[i]);
        }
        
        objeto = produto;
    }
    
    
    //Construtor da arvore de consulta contendo uma juncao.
    public Consulta(Juncao juncao)
    {
        this.start();
        Object[] obj;
        int i;
        
        //Cria a aresta que liga o Produto ate a arvore da consulta 1 da juncao
        DefaultEdge edge1 = new DefaultEdge();
        edge1.setSource(juncao.getChildAt(0));
        edge1.setTarget(((DefaultGraphCell) juncao.getConsulta1().getObject()).getChildAt(0));
        
        GraphConstants.setDisconnectable(edge1.getAttributes(), false);
        GraphConstants.setResize(edge1.getAttributes(),false);
        GraphConstants.setLabelAlongEdge(edge1.getAttributes(), true);
        GraphConstants.setEditable(edge1.getAttributes(),false);
        
        //Cria a aresta que liga o Produto ate a arvore da consulta 2 da juncao
        DefaultEdge edge2 = new DefaultEdge();
        edge2.setSource(juncao.getChildAt(0));
        edge2.setTarget(((DefaultGraphCell) juncao.getConsulta2().getObject()).getChildAt(0));
        
        GraphConstants.setDisconnectable(edge1.getAttributes(), false);
        GraphConstants.setResize(edge1.getAttributes(),false);
        GraphConstants.setLabelAlongEdge(edge1.getAttributes(), true);
        GraphConstants.setEditable(edge1.getAttributes(),false);
        
        
        celulas.add(edge1);
        celulas.add(edge2);
        celulas.add(juncao);
        obj = juncao.getConsulta1().getObjects();
        for(i = 0; i < obj.length; i++)
        {
            celulas.add(obj[i]);
        }
        obj = juncao.getConsulta2().getObjects();
        for(i = 0; i < obj.length; i++)
        {
            celulas.add(obj[i]);
        }
        
        objeto = juncao;
    }
    
    
    //Funcao que retorna as celulas da arvore de consulta do JGraph uma a uma, deve ser utilizada como o mysql_fetch_array() do php
    public Object[] getCells()
    {
        return celulas.toArray();
    }

    //Funcao que retorna a raiz da arvore de consulta.
    public Object getObject()
    {
        return this.objeto;
    }
    
    //Funcao que retorna todas as celulas da arvore de consulta num array.
    public Object[] getObjects()
    {
        return celulas.toArray();
    }
    
}
